/* x86 MMU 定义宏 */

#ifndef _MMU_H
#define _MMU_H

// 控制寄存器
#define CR0_PE      0x00000001      // 保护模式使能
#define CR0_WP      0x00010000      // 写保护
#define CR0_PG      0x80000000      // 分页使能

#define CR4_PSE     0x00000010      // 页大小为 4M

// 段选择子  
#define SEG_KCODE   1               // 内核代码段
#define SEG_KDATA   2               // 内核数据段
#define SEG_UCODE   3               // 用户代码段
#define SEG_UDATA   4               // 用户数据段
#define SEG_TSS     5               // 进程TSS段

// 32位虚拟地址由以下几部分组成:
//
// +--------10------+-------10-------+---------12----------+
// | Page Directory |   Page Table   | Offset within Page  |
// |      Index     |      Index     |                     |
// +----------------+----------------+---------------------+
//  \--- PDX(va) --/ \--- PTX(va) --/

// 页目录和页表项宏定义
#define NPDENTRIES  1024            // 页目录项个数
#define NPTENTRIES  1024            // 页表项个数
#define PGSIZE      4096            // 页大小

#define PTXSHIFT    12              // PTX 页表项索引偏移位置
#define PDXSHIFT    22              // PDX 页目录项索引偏移位置

#define PGROUNDUP(sz)   (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a)  (((a)) & ~(PGSIZE-1))


// 页目录/页表项属性标志
#define PTE_P       0x001           // 页存在
#define PTE_W       0x002           // 可写
#define PTE_U       0x004           // 用户页
#define PTE_PS      0x080           // 页大小

#endif /* _MMU_H */